package org.an.proj.contacts.ui.msg;

import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.an.ku.base.BaseFragment;
import org.an.ku.util.ToastUtil;
import org.an.ku.view.MyProgressBar;
import org.an.proj.contacts.MyApplication;
import org.an.proj.contacts.config.LogUtil;
import org.an.proj.contacts.eventbus.EventTag;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;

/**
 * 创建时间：2017年01月17日11:04 <br>
 * 作者：fuchaoyang <br>
 * 描述：
 * 事实上fragment的isVisible方法仅仅与hide()有关，isResumed仅仅与onResume有关，两者并没有关联
 * 所以判断一个子Fragment是否对用户是可见，需要判断 isVisible()&&parent.isVisible()&&isResumed()
 * （子Fragment isResumed=true时，parent.isResumed一定是true不用做此判断）
 */

public class ChatMsgFragment extends BaseFragment {
  public static final String TAG = "ChatMsgFragment";
  private MyProgressBar mProgressBar;
  private Handler mHandler = new Handler();

  @Override public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mProgressBar = new MyProgressBar(getActivity());
    EventBus.getDefault().register(this);
  }

  @Nullable @Override
  public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
      @Nullable Bundle savedInstanceState) {
    TextView textView = new TextView(getActivity());
    textView.setText("ChatMsgFragment");
    return textView;
  }

  @Override public void onDestroyView() {
    EventBus.getDefault().unregister(this);
    super.onDestroyView();
  }

  private void refresh() {
    mProgressBar.dismiss();
    ToastUtil.toast(MyApplication.getInstance(), "刷新消息列表");
    // 执行完刷新操作后，重置时间
    mDelayTime = -1;
  }

  private int mDelayTime = -1;

  /**
   * 场景：该Fragment可见后，切换Msg Tab到其他Tab然后又跳转Activity，在Activity中发了Eventbus
   */
  @Subscribe() public void refresh(EventTag.TagChatMsgRefresh event) {
    mDelayTime = event.delayTime;
    LogUtil.i(TAG,
        String.format("refresh:isResumed(%b),isHidden(%b),isVisible(%b)", isResumed(), isHidden(),
            isVisible()));
    // 当前Fragment的父Fragment被切走了（hide），然后再跳转到另一个Activity，发Eventbus，这个Fragment收到之后的状态
    // refresh:isResumed(false),isHidden(false),isVisible(true)
    // 此时isVisible=true,但是isResumed=false,
    Fragment parent = getParentFragment();
    if (parent != null) {
      // 使用ViewPager时，parent==null
      LogUtil.i(TAG,
          String.format("parent refresh:isResumed(%b),isHidden(%b),isVisible(%b)，isAdd(%b)",
              parent.isResumed(), parent.isHidden(), parent.isVisible(), isAdded()));
      // parent refresh:isResumed(false),isHidden(true),isVisible(false)，isAdd(true)
    }
  }

  private void handleRefresh() {
    if (isVisible() && isResumed()) {
      Fragment parent = getParentFragment();
      if (parent != null) {
        if (parent.isVisible()) {
          if (mDelayTime != -1) {
            mProgressBar.show();
            mHandler.postDelayed(new Runnable() {
              @Override public void run() {
                refresh();
              }
            }, mDelayTime);
          }
        }
      }
    }
  }

  @Override public void onResume() {
    super.onResume();
    // 在父Fragment onResume之后才会回调，isResume=true
    LogUtil.i(TAG,
        String.format("onResume:isResumed(%b),isHidden(%b),isVisible(%b),isAdded(%b)", isResumed(),
            isHidden(), isVisible(), isAdded()));
    // onResume:isResumed(true),isHidden(false),isVisible(true),isAdded(true)

    Fragment parent = getParentFragment();
    // 如果是放到Fragment中的ViewPager中的，那么getParentFragment()==null
    if (parent != null) {
      LogUtil.i(TAG,
          String.format("parent onResume:isResumed(%b),isHidden(%b),isVisible(%b),isAdded(%b)",
              parent.isResumed(), parent.isHidden(), parent.isVisible(), isAdded()));
      // parent onResume:isResumed(true),isHidden(false),isVisible(true),isAdded(true)
    }
    // onResume时处于当前Fragment时直接在onResume中处理
    handleRefresh();
  }

  /**
   * 嵌套在Fragment中的子Fragment，在父Fragment第一次创建还未显示时（还没有onResume），会回调这个方法两次
   * 在两个子Fragment切换时（hide,show），也会回调，状态如下
   * onHiddenChanged:isResumed(true),isHidden(true),isVisible(false)，isAdd(true)
   */
  @Override public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    LogUtil.i(TAG,
        String.format("onHiddenChanged:isResumed(%b),isHidden(%b),isVisible(%b)，isAdd(%b)",
            isResumed(), isHidden(), isVisible(), isAdded()));
    // 1.onHiddenChanged:isResumed(false),isHidden(true),isVisible(false)，isAdd(true)
    // 2.onHiddenChanged:isResumed(false),isHidden(false),isVisible(true)，isAdd(true)
    Fragment parent = getParentFragment();
    if (parent != null) {
      LogUtil.i(TAG,
          String.format("parent onHiddenChanged:isResumed(%b),isHidden(%b),isVisible(%b)，isAdd(%b)",
              parent.isResumed(), parent.isHidden(), parent.isVisible(), isAdded()));
      // 1.第一次父Fragment没有Resume，但是已经isVisible了
      // 1.parent onHiddenChanged:isResumed(false),isHidden(false),isVisible(true)，isAdd(true)
      // 2.parent onHiddenChanged:isResumed(false),isHidden(false),isVisible(true)，isAdd(true)
    }

    // fixme 如果在onResume时当前fragment isVisible=false,那么在onResume中处理就没用了，然而切换父层tab时不会回调这个方法了
    // 这里为了兼容这个，在父Fragment 的这个方法里，去主动调用子Fragment的这个方法
    handleRefresh();
  }

  // isVisible 方法时这么写的
  /*final public boolean isVisible() {
    return isAdded() && !isHidden() && mView != null
        && mView.getWindowToken() != null && mView.getVisibility() == View.VISIBLE;
  }*/
}
